package com.diyunapp.xilinapp.me;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.diyunapp.xilinapp.R;
import com.diyunapp.xilinapp.utils.AccessTokenKeeper;
import com.diyunapp.xilinapp.utils.BaseUiListener;
import com.sina.weibo.sdk.api.ImageObject;
import com.sina.weibo.sdk.api.TextObject;
import com.sina.weibo.sdk.api.WebpageObject;
import com.sina.weibo.sdk.api.WeiboMultiMessage;
import com.sina.weibo.sdk.api.share.BaseResponse;
import com.sina.weibo.sdk.api.share.IWeiboHandler;
import com.sina.weibo.sdk.api.share.IWeiboShareAPI;
import com.sina.weibo.sdk.api.share.SendMultiMessageToWeiboRequest;
import com.sina.weibo.sdk.api.share.WeiboShareSDK;
import com.sina.weibo.sdk.auth.AuthInfo;
import com.sina.weibo.sdk.auth.Oauth2AccessToken;
import com.sina.weibo.sdk.auth.WeiboAuthListener;
import com.sina.weibo.sdk.auth.sso.SsoHandler;
import com.sina.weibo.sdk.constant.WBConstants;
import com.sina.weibo.sdk.exception.WeiboException;
import com.sina.weibo.sdk.utils.Utility;
import com.tencent.connect.share.QQShare;
import com.tencent.mm.sdk.modelmsg.SendMessageToWX;
import com.tencent.mm.sdk.modelmsg.WXMediaMessage;
import com.tencent.mm.sdk.modelmsg.WXWebpageObject;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.WXAPIFactory;
import com.tencent.tauth.Tencent;

import java.text.SimpleDateFormat;

public class ShareDoActivity extends Activity implements OnClickListener,IWeiboHandler.Response {


	private String shareInfo;
	private LinearLayout ll_wx_friend;
	private LinearLayout ll_wx_circle;
	private LinearLayout ll_qq_friend;
	private LinearLayout ll_sina_weibo;
	private Button share_cancel_bt;
	
	private IWXAPI wxApi;  
	private Tencent mTencent;
	
	private static final String WX_APP_ID = "wx3d34176dc151d20a";
	private static final String QQ_APP_ID = "1105537492";

	public static final String SINA_APP_KEY      = "2384017875";		   // 应用的APP_KEY
    public static final String REDIRECT_URL = "https://api.weibo.com/oauth2/default.html";// 应用的回调页
	
    /** 显示认证后的信息，如 AccessToken */
    private TextView mTokenText;
    
    private AuthInfo mAuthInfo;
    private boolean ssoState = false;
    
    /** 封装了 "access_token"，"expires_in"，"refresh_token"，并提供了他们的管理功能  */
    private Oauth2AccessToken mAccessToken;

    /** 注意：SsoHandler 仅当 SDK 支持 SSO 时有效 */
    private SsoHandler mSsoHandler;

    private IWeiboShareAPI mWeiboShareAPI = null;

    private final String SHAREURL = "http://www.xilingou.com/mobile/down/share/share.html";
    private final String SHAREIMGURL = "http://www.xilingou.com/mobile/down/share/images/XiLinMarketDownload.png";
    private final String SHARETITLE = "希霖商城APP";
    private final String SHAREINFO = "希霖国际贸易有限公司是经国家工商行政管理总局依法核准于2016年3月成立，公司总部设在泉城济南";
    private int SHAREIMAGEID = R.drawable.downloadcode;
    
    @Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.share_select);

		ll_wx_friend = (LinearLayout)findViewById(R.id.share_friend_ll);
		ll_wx_friend.setOnClickListener(this);
		ll_wx_circle = (LinearLayout)findViewById(R.id.friend_circle_ll);
		ll_wx_circle.setOnClickListener(this);
		ll_qq_friend = (LinearLayout)findViewById(R.id.qq_friend_ll);
		ll_qq_friend.setOnClickListener(this);
		ll_sina_weibo = (LinearLayout)findViewById(R.id.sina_weibo_ll);
		ll_sina_weibo.setOnClickListener(this);
		share_cancel_bt = (Button)findViewById(R.id.cancel_share_bt);
		share_cancel_bt.setOnClickListener(this);
		
		//微信实例化  
		wxApi = WXAPIFactory.createWXAPI(this, WX_APP_ID, true);  
		wxApi.registerApp(WX_APP_ID); 
		
		// Tencent类是SDK的主要实现类，开发者可通过Tencent类访问腾讯开放的OpenAPI。
		// 其中APP_ID是分配给第三方应用的appid，类型为String。
		mTencent = Tencent.createInstance(QQ_APP_ID, this.getApplicationContext());
		
		// 创建微博分享接口实例
        mWeiboShareAPI = WeiboShareSDK.createWeiboAPI(this, SINA_APP_KEY);
     // 注册第三方应用到微博客户端中，注册成功后该应用将显示在微博的应用列表中。
        // 但该附件栏集成分享权限需要合作申请，详情请查看 Demo 提示
        // NOTE：请务必提前注册，即界面初始化的时候或是应用程序初始化时，进行注册
        mWeiboShareAPI.registerApp();
        // 当 Activity 被重新初始化时（该 Activity 处于后台时，可能会由于内存不足被杀掉了），
        // 需要调用 {@link IWeiboShareAPI#handleWeiboResponse} 来接收微博客户端返回的数据。
        // 执行成功，返回 true，并调用 {@link IWeiboHandler.Response#onResponse}；
        // 失败返回 false，不调用上述回调
        if (savedInstanceState != null) {
            mWeiboShareAPI.handleWeiboResponse(getIntent(), this);
        }
	}
	
	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.share_friend_ll:
			Toast.makeText(getApplicationContext(), "正在打开微信好友列表，请稍候...", Toast.LENGTH_LONG).show();
			wechatShare(0);
			break;
		case R.id.friend_circle_ll:
			Toast.makeText(getApplicationContext(), "正在打开微信朋友圈，请稍候...", Toast.LENGTH_LONG).show();
			wechatShare(1);
			break;
		case R.id.qq_friend_ll:
			Toast.makeText(getApplicationContext(), "正在打开QQ好友，请稍候...", Toast.LENGTH_LONG).show();
			QQshareTofriend();
			break;
		case R.id.sina_weibo_ll:
			Toast.makeText(getApplicationContext(), "正在建立微博分享，请稍候...", Toast.LENGTH_LONG).show();
			ssoAuth();
			break;
		case R.id.cancel_share_bt:
			finish();
			break;
		default:
			break;
		}
	}
	
	/** 
	 * 微信分享 （这里仅提供一个分享网页的示例，其它请参看官网示例代码） 
	 * @param flag(0:分享到微信好友，1：分享到微信朋友圈) 
	 */  
	private void wechatShare(int flag){  
	    WXWebpageObject webpage = new WXWebpageObject();  
	    webpage.webpageUrl = SHAREURL;
	    WXMediaMessage msg = new WXMediaMessage(webpage);  
	    msg.title = SHARETITLE;
	    msg.description =SHAREINFO;
	    //这里替换一张自己工程里的图片资源  
	    Bitmap thumb = BitmapFactory.decodeResource(getResources(), SHAREIMAGEID);
	    msg.setThumbImage(thumb);  
	      
	    SendMessageToWX.Req req = new SendMessageToWX.Req();  
	    req.transaction = String.valueOf(System.currentTimeMillis());
	    req.message = msg;  
	    req.scene = flag==0?SendMessageToWX.Req.WXSceneSession:SendMessageToWX.Req.WXSceneTimeline;  
	    wxApi.sendReq(req);  
	}  
	
	private void QQshareTofriend()
	{
		final Bundle params = new Bundle();
		params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT);
		params.putString(QQShare.SHARE_TO_QQ_TITLE, SHARETITLE);
		params.putString(QQShare.SHARE_TO_QQ_SUMMARY,  SHAREINFO);
	    params.putString(QQShare.SHARE_TO_QQ_TARGET_URL, SHAREURL);
	    params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL,SHAREIMGURL);   // TODO: 2016/7/20
        params.putString(QQShare.SHARE_TO_QQ_APP_NAME,  SHARETITLE);
	    mTencent.shareToQQ(ShareDoActivity.this, params, new BaseUiListener());
	}
	
	/**
     * 当 SSO 授权 Activity 退出时，该函数被调用。
     * 
     * @see {@link Activity#onActivityResult}
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        
        // SSO 授权回调
        // 重要：发起 SSO 登陆的 Activity 必须重写 onActivityResults
        if (mSsoHandler != null) {
            mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
        }
        
    }

    private void ssoAuth()
    {
		mAccessToken = AccessTokenKeeper.readAccessToken(this);
        if (mAccessToken.isSessionValid()) {
        	ssoState = true;
            updateTokenView(ssoState);
            sendMessage();
        }
        else
        {
        	ssoState = false;
        	mAuthInfo = new AuthInfo(this, SINA_APP_KEY, REDIRECT_URL,null);
    	    mSsoHandler = new SsoHandler(ShareDoActivity.this, mAuthInfo);
    	    mSsoHandler.authorizeClientSso(new AuthListener());
        }
    }
	/**
     * 微博认证授权回调类。
     * 1. SSO 授权时，需要在 {@link #onActivityResult} 中调用 {@link SsoHandler#authorizeCallBack} 后，
     *    该回调才会被执行。
     * 2. 非 SSO 授权时，当授权结束后，该回调就会被执行。
     * 当授权成功后，请保存该 access_token、expires_in、uid 等信息到 SharedPreferences 中。
     */
    class AuthListener implements WeiboAuthListener {
        
        @Override
        public void onComplete(Bundle values) {
            // 从 Bundle 中解析 Token
            mAccessToken = Oauth2AccessToken.parseAccessToken(values);
            //从这里获取用户输入的 电话号码信息 
            String phoneNum =  mAccessToken.getPhoneNum();
            if (mAccessToken.isSessionValid()) {
                // 保存 Token 到 SharedPreferences
            	updateTokenView(ssoState);
                AccessTokenKeeper.writeAccessToken(ShareDoActivity.this, mAccessToken);
                ssoState = true;
                sendMessage();
            } else {
                // 以下几种情况，您会收到 Code：
                // 1. 当您未在平台上注册的应用程序的包名与签名时；
                // 2. 当您注册的应用程序包名与签名不正确时；
                // 3. 当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。
                String code = values.getString("code");
                String message ="授权失败";
                if (!TextUtils.isEmpty(code)) {
                    message = message + "\nObtained the code: " + code;
                }
                Toast.makeText(ShareDoActivity.this, message, Toast.LENGTH_LONG).show();
            }
        }

        @Override
        public void onCancel() {
            Toast.makeText(ShareDoActivity.this,
                  "取消授权", Toast.LENGTH_LONG).show();
        }

        @Override
        public void onWeiboException(WeiboException e) {
            Toast.makeText(ShareDoActivity.this,
                    "Auth exception : " + e.getMessage(), Toast.LENGTH_LONG).show();
        }
    }
    
    /**
     * 显示当前 Token 信息。
     * 
     * @param hasExisted 配置文件中是否已存在 token 信息并且合法
     */
    private void updateTokenView(boolean hasExisted) {
        String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(
                new java.util.Date(mAccessToken.getExpiresTime()));
        String format = "Token：%1$s \n有效期：%2$s";
        String message = String.format(format, mAccessToken.getToken(), date);
        if (hasExisted) {
            message = "微博分享......";
        }
        else
        {
        	message = "授权成功，马上分享......";
        }
        Toast.makeText(ShareDoActivity.this, message, Toast.LENGTH_LONG).show();
    }

    /**
     * @see {@link Activity#onNewIntent}
     */	
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        
        // 从当前应用唤起微博并进行分享后，返回到当前应用时，需要在此处调用该函数
        // 来接收微博客户端返回的数据；执行成功，返回 true，并调用
        // {@link IWeiboHandler.Response#onResponse}；失败返回 false，不调用上述回调
        mWeiboShareAPI.handleWeiboResponse(intent, this);
    }
    
    /*
     * 接收微客户端博请求的数据。
     * 当微博客户端唤起当前应用并进行分享时，该方法被调用。
     * 
     * @param baseRequest 微博请求数据对象
     * @see {@link IWeiboShareAPI#handleWeiboRequest}
     */
    @Override
    public void onResponse(BaseResponse baseResp) {
        switch (baseResp.errCode) {
        case WBConstants.ErrorCode.ERR_OK:
            Toast.makeText(this, "分享成功", Toast.LENGTH_LONG).show();
            break;
        case WBConstants.ErrorCode.ERR_CANCEL:
            Toast.makeText(this,"取消分享", Toast.LENGTH_LONG).show();
            break;
        case WBConstants.ErrorCode.ERR_FAIL:
            Toast.makeText(this,
            		"分享失败" + "Error Message: " + baseResp.errMsg, 
                    Toast.LENGTH_LONG).show();
            break;
        }
        finish();
    }

    /*
     * 第三方应用发送请求消息到微博，唤起微博分享界面。
     * @see {@link #sendMultiMessage} 或者 {@link #sendSingleMessage}
     */
    private void sendMessage() {
        
            if (mWeiboShareAPI.isWeiboAppSupportAPI()) {
            	sendMultiMessage();
            } 
            else 
            {
                Toast.makeText(this, "微博客户端不支持 SDK 分享或微博客户端未安装或微博客户端是非官方版本。", Toast.LENGTH_SHORT).show();
            }
    }
    
/*   /**
     * 第三方应用发送请求消息到微博，唤起微博分享界面。
     * 注意：当 {@link IWeiboShareAPI#getWeiboAppSupportAPI()} >= 10351 时，支持同时分享多条消息，
     * 同时可以分享文本、图片以及其它媒体资源（网页、音乐、视频、声音中的一种）。
     * 
     * @param hasText    分享的内容是否有文本
     * @param hasImage   分享的内容是否有图片
     * @param hasWebpage 分享的内容是否有网页
     * @param hasMusic   分享的内容是否有音乐
     * @param hasVideo   分享的内容是否有视频
     * @param hasVoice   分享的内容是否有声音
     **/
    private void sendMultiMessage() {
        // 1. 初始化微博的分享消息
        WeiboMultiMessage weiboMessage = new WeiboMultiMessage();
        weiboMessage.textObject = getTextObj();
        weiboMessage.imageObject = getImageObj();
        weiboMessage.mediaObject = getWebpageObj();
        // 2. 初始化从第三方到微博的消息请求
        SendMultiMessageToWeiboRequest request = new SendMultiMessageToWeiboRequest();
        // 用transaction唯一标识一个请求
        request.transaction = String.valueOf(System.currentTimeMillis());
        request.multiMessage = weiboMessage;
        
        // 3. 发送请求消息到微博，唤起微博分享界面
        mWeiboShareAPI.sendRequest(ShareDoActivity.this, request);
    }

    /**
     * 创建文本消息对象。
     * 
     * @return 文本消息对象。
     */
    private TextObject getTextObj() {
        TextObject textObject = new TextObject();
        textObject.text = SHAREINFO;
        return textObject;
    }
    
    /**
     * 创建图片消息对象。
     * 
     * @return 图片消息对象。
     */
    private ImageObject getImageObj() {
        ImageObject imageObject = new ImageObject();
        //        设置缩略图。 注意：最终压缩过的缩略图大小不得超过 32kb。
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), SHAREIMAGEID);
        imageObject.setImageObject(bitmap);
        return imageObject;
    }

    /**
     * 创建多媒体（网页）消息对象。
     * 
     * @return 多媒体（网页）消息对象。
     */
    private WebpageObject getWebpageObj() {
        WebpageObject mediaObject = new WebpageObject();
        mediaObject.identify = Utility.generateGUID();
        mediaObject.title = SHARETITLE;
        mediaObject.description = SHAREINFO;

        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.list_default);
        // 设置 Bitmap 类型的图片到视频对象里         设置缩略图。 注意：最终压缩过的缩略图大小不得超过 32kb。
        mediaObject.setThumbImage(bitmap);
        mediaObject.actionUrl = SHAREURL;
        mediaObject.defaultText =SHAREINFO;
        return mediaObject;
    }
}
